--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RNS/Utilities/rnpath.py b6bfd1655cbcda3c3da5389f0ed2a7b9f7db959b (b6bfd165) Text, 27.05 KB
T8b949e#!/usr/bin/env python3
T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2016-2025 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.
Tff7b72import T7ee787RNS
Tff7b72import T7ee787os
Tff7b72import T7ee787sys
Tff7b72import T7ee787time
Tff7b72import T7ee787argparse
Tff7b72from T7ee787RNST7ee787.T7ee787_version Tff7b72import Te6edf3__version__
Te6edf3remote_link Tff7b72= Tff7b72None
Te6edf3output_rst_str Tff7b72= Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ff"
Tff7b72def Td2a8ffconnect_remoteTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3auth_identityTb4b4b4, Te6edf3timeoutTb4b4b4, Te6edf3no_output Tff7b72= Tff7b72FalseTb4b4b4, Te6edf3purposeTff7b72=Ta5d6ff"Ta5d6ffmanagementTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3remote_linkTb4b4b4, Te6edf3reticulum
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPath to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff requestedTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3pr_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72while Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3pr_time Tff7b72> Te6edf3timeoutTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPath request timed outTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff12Tb4b4b4)
Te6edf3remote_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72def Td2a8ffremote_link_closedTb4b4b4(Te6edf3linkTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3linkTff7b72.Td2a8ffteardown_reason Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffTIMEOUTTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe link timed out, exiting nowTa5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3linkTff7b72.Td2a8ffteardown_reason Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffDESTINATION_CLOSEDTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe link was closed by the server, exiting nowTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffLink closed unexpectedly, exiting nowTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff10Tb4b4b4)
Tff7b72def Td2a8ffremote_link_establishedTb4b4b4(Te6edf3linkTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3remote_link
Tff7b72if Te6edf3purpose Tff7b72== Ta5d6ff"Ta5d6ffmanagementTa5d6ff"Tb4b4b4: Te6edf3linkTff7b72.Td2a8ffidentifyTb4b4b4(Te6edf3auth_identityTb4b4b4)
Te6edf3remote_link Tff7b72= Te6edf3link
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffEstablishing link with remote transport instance...Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3purpose Tff7b72== Ta5d6ff"Ta5d6ffmanagementTa5d6ff"Tb4b4b4: Te6edf3remote_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Ta5d6ff"Ta5d6ffrnstransportTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffremoteTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmanagementTa5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3purpose Tff7b72== Ta5d6ff"Ta5d6ffblackholeTa5d6ff"Tb4b4b4: Te6edf3remote_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Ta5d6ff"Ta5d6ffrnstransportTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffinfoTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffblackholeTa5d6ff"Tb4b4b4)
Te6edf3link Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3remote_destinationTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_link_established_callbackTb4b4b4(Te6edf3remote_link_establishedTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_link_closed_callbackTb4b4b4(Te6edf3remote_link_closedTb4b4b4)
Tff7b72def Td2a8ffparse_hashTb4b4b4(Te6edf3input_strTb4b4b4)Tb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3input_strTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffHash length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3hash_bytes Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3input_strTb4b4b4)
Tff7b72return Te6edf3hash_bytes
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid hash entered. Check your input.Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffprogram_setupTb4b4b4(Te6edf3configdirTb4b4b4, Te6edf3tableTb4b4b4, Te6edf3ratesTb4b4b4, Te6edf3dropTb4b4b4, Te6edf3destination_hexhashTb4b4b4, Te6edf3verbosityTb4b4b4, Te6edf3timeoutTb4b4b4, Te6edf3drop_queuesTb4b4b4,
Te6edf3drop_viaTb4b4b4, Te6edf3max_hopsTb4b4b4, Te6edf3remoteTff7b72=Tff7b72NoneTb4b4b4, Te6edf3management_identityTff7b72=Tff7b72NoneTb4b4b4, Te6edf3remote_timeoutTff7b72=Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUTTb4b4b4,
Te6edf3blackholedTff7b72=Tff7b72FalseTb4b4b4, Te6edf3blackholeTff7b72=Tff7b72FalseTb4b4b4, Te6edf3unblackholeTff7b72=Tff7b72FalseTb4b4b4, Te6edf3blackhole_durationTff7b72=Tff7b72NoneTb4b4b4, Te6edf3blackhole_reasonTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3remote_blackhole_listTff7b72=Tff7b72FalseTb4b4b4, Te6edf3remote_blackhole_list_filterTff7b72=Tff7b72NoneTb4b4b4, Te6edf3no_outputTff7b72=Tff7b72FalseTb4b4b4, Te6edf3jsonTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3remote_linkTb4b4b4, Te6edf3reticulum
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdir Tff7b72= Te6edf3configdirTb4b4b4, Te6edf3loglevel Tff7b72= T79c0ff3Tff7b72+Te6edf3verbosityTb4b4b4)
Tff7b72if Te6edf3remoteTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3remoteTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDestination length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3identity_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3remoteTb4b4b4)
Te6edf3remote_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhash_from_name_and_identityTb4b4b4(Ta5d6ff"Ta5d6ffrnstransport.remote.managementTa5d6ff"Tb4b4b4, Te6edf3identity_hashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination entered. Check your input.Ta5d6ff"Tb4b4b4)
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3management_identityTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3identity Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffCould not load management identity from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3management_identityTb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3connect_remoteTb4b4b4(Te6edf3remote_hashTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3remote_timeoutTb4b4b4, Te6edf3no_outputTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tff7b72raise Te6edf3e
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff20Tb4b4b4)
Tff7b72while Te6edf3remote_link Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tff7b72if Te6edf3blackholed Tff7b72or Te6edf3remote_blackhole_listTb4b4b4:
Te6edf3blackholed_list Tff7b72= Tff7b72None
Tff7b72if Te6edf3blackholedTb4b4b4:
Tff7b72if Te6edf3remote_linkTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffListing blackholed identities on remote instances not yet implementedTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff255Tb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3blackholed_list Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffget_blackholed_identitiesTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not get blackholed identities from RNS instance: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff20Tb4b4b4)
Tff7b72elif Te6edf3remote_blackhole_listTb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3identity_hash Tff7b72= Te6edf3parse_hashTb4b4b4(Te6edf3destination_hexhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff20Tb4b4b4)
Te6edf3remote_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhash_from_name_and_identityTb4b4b4(Ta5d6ff"Ta5d6ffrnstransport.info.blackholeTa5d6ff"Tb4b4b4, Te6edf3identity_hashTb4b4b4)
Te6edf3connect_remoteTb4b4b4(Te6edf3remote_hashTb4b4b4, Tff7b72NoneTb4b4b4, Te6edf3remote_timeoutTb4b4b4, Te6edf3no_outputTb4b4b4, Te6edf3purposeTff7b72=Ta5d6ff"Ta5d6ffblackholeTa5d6ff"Tb4b4b4)
Tff7b72while Te6edf3remote_link Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending request...Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3receipt Tff7b72= Te6edf3remote_linkTff7b72.Td2a8ffrequestTb4b4b4(Ta5d6ff"Ta5d6ff/listTa5d6ff"Tb4b4b4)
Tff7b72while Tff7b72not Te6edf3receiptTff7b72.Td2a8ffconcludedTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3receiptTff7b72.Td2a8ffget_responseTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3responseTb4b4b4) Tff7b72== Tffa657dictTb4b4b4:
Te6edf3blackholed_list Tff7b72= Te6edf3response
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe remote request failed.Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff10Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNowhere to fetch blackhole list fromTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff255Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3blackholed_listTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffNo blackholed identity data availableTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff20Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3rmlen Tff7b72= T79c0ff64
Tff7b72def Td2a8fftruncTb4b4b4(Te6edf3input_strTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3input_strTb4b4b4) Tff7b72<Tff7b72= Te6edf3rmlenTb4b4b4: Tff7b72return Te6edf3input_str
Tff7b72elseTb4b4b4: Tff7b72return Ta5d6fffTa5d6ff"Tffd700{Te6edf3input_strTb4b4b4[Tb4b4b4:Te6edf3rmlenTff7b72-T79c0ff1Tb4b4b4]Tffd700}Ta5d6ff…Ta5d6ff"
Tff7b72tryTb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3identity_hash Tff7b72in Te6edf3blackholed_listTb4b4b4:
Te6edf3until Tff7b72= Te6edf3blackholed_listTb4b4b4[Te6edf3identity_hashTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffuntilTa5d6ff"Tb4b4b4]
Te6edf3reason Tff7b72= Te6edf3blackholed_listTb4b4b4[Te6edf3identity_hashTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffreasonTa5d6ff"Tb4b4b4]
Te6edf3source Tff7b72= Te6edf3blackholed_listTb4b4b4[Te6edf3identity_hashTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4]
Te6edf3until_str Tff7b72= Ta5d6fffTa5d6ff"Ta5d6fffor Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettytimeTb4b4b4(Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3untilTff7b72-Te6edf3nowTb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff" Tff7b72if Te6edf3until Tff7b72else Ta5d6ff"Ta5d6ffindefinitelyTa5d6ff"
Te6edf3reason_str Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff (Tffd700{Te6edf3truncTb4b4b4(Te6edf3reasonTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff" Tff7b72if Te6edf3reason Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3by_str Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff by Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3sourceTb4b4b4)Tffd700}Ta5d6ff" Tff7b72if Te6edf3source Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhash Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3filter_str Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identity_hashTb4b4b4)Tffd700}Ta5d6ff Tffd700{Te6edf3until_strTffd700}Ta5d6ff Tffd700{Te6edf3reason_strTffd700}Ta5d6ff Tffd700{Te6edf3by_strTffd700}Ta5d6ff"
Tff7b72if Tff7b72not Te6edf3remote_blackhole_listTb4b4b4:
Tff7b72if Te6edf3destination_hexhash Tff7b72and Tff7b72not Te6edf3destination_hexhash Tff7b72in Te6edf3filter_strTb4b4b4: Tff7b72continue
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3remote_blackhole_list_filter Tff7b72and Tff7b72not Te6edf3remote_blackhole_list_filter Tff7b72in Te6edf3filter_strTb4b4b4: Tff7b72continue
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identity_hashTb4b4b4)Tffd700}Ta5d6ff blackholed Tffd700{Te6edf3until_strTffd700}Tffd700{Te6edf3reason_strTffd700}Tffd700{Te6edf3by_strTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while displaying collected blackhole data: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff20Tb4b4b4)
Tff7b72elif Te6edf3blackholeTb4b4b4:
Tff7b72if Te6edf3remote_linkTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffBlackholing identity on remote instances not yet implementedTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff255Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3identity_hash Tff7b72= Te6edf3parse_hashTb4b4b4(Te6edf3destination_hexhashTb4b4b4)
Te6edf3until Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3blackhole_durationTff7b72*T79c0ff60Tff7b72*T79c0ff60 Tff7b72if Te6edf3blackhole_duration Tff7b72else Tff7b72None
Te6edf3result Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffblackhole_identityTb4b4b4(Te6edf3identity_hashTb4b4b4, Te6edf3untilTff7b72=Te6edf3untilTb4b4b4, Te6edf3reasonTff7b72=Te6edf3blackhole_reasonTb4b4b4)
Tff7b72if Te6edf3result Tff7b72== Tff7b72TrueTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffBlackholed identity Tffd700{Te6edf3destination_hexhashTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3result Tff7b72== Tff7b72NoneTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffIdentity Tffd700{Te6edf3destination_hexhashTffd700}Ta5d6ff already blackholedTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not blackhole identity Tffd700{Te6edf3destination_hexhashTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not blackhole identity: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff20Tb4b4b4)
Tff7b72elif Te6edf3unblackholeTb4b4b4:
Tff7b72if Te6edf3remote_linkTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffBlackholing identity on remote instances not yet implementedTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff255Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3identity_hash Tff7b72= Te6edf3parse_hashTb4b4b4(Te6edf3destination_hexhashTb4b4b4)
Te6edf3result Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffunblackhole_identityTb4b4b4(Te6edf3identity_hashTb4b4b4)
Tff7b72if Te6edf3result Tff7b72== Tff7b72TrueTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffLifted blackhole for identity Tffd700{Te6edf3destination_hexhashTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3result Tff7b72== Tff7b72NoneTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffIdentity Tffd700{Te6edf3destination_hexhashTffd700}Ta5d6ff not blackholedTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not unblackhole identity Tffd700{Te6edf3destination_hexhashTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not unblackhole identity: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff20Tb4b4b4)
Tff7b72elif Te6edf3tableTb4b4b4:
Te6edf3destination_hash Tff7b72= Tff7b72None
Tff7b72if Te6edf3destination_hexhash Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3destination_hexhashTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDestination length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3destination_hexhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination entered. Check your input.Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3remote_linkTb4b4b4: Te6edf3table Tff7b72= Tffa657sortedTb4b4b4(Te6edf3reticulumTff7b72.Td2a8ffget_path_tableTb4b4b4(Te6edf3max_hopsTff7b72=Te6edf3max_hopsTb4b4b4)Tb4b4b4, Te6edf3keyTff7b72=Tff7b72lambda Te6edf3eTb4b4b4: Tb4b4b4(Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6ffinterfaceTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4]Tb4b4b4) Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending request...Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3receipt Tff7b72= Te6edf3remote_linkTff7b72.Td2a8ffrequestTb4b4b4(Ta5d6ff"Ta5d6ff/pathTa5d6ff"Tb4b4b4, Te6edf3data Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6fftableTa5d6ff"Tb4b4b4, Te6edf3destination_hashTb4b4b4, Te6edf3max_hopsTb4b4b4]Tb4b4b4)
Tff7b72while Tff7b72not Te6edf3receiptTff7b72.Td2a8ffconcludedTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3receiptTff7b72.Td2a8ffget_responseTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3responseTb4b4b4:
Te6edf3table Tff7b72= Te6edf3response
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe remote request failed. Likely authentication failure.Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff10Tb4b4b4)
Te6edf3displayed Tff7b72= T79c0ff0
Tff7b72if Te6edf3jsonTb4b4b4:
Tff7b72import T7ee787json
Tff7b72for Te6edf3p Tff7b72in Te6edf3tableTb4b4b4:
Tff7b72for Te6edf3k Tff7b72in Te6edf3pTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3pTb4b4b4[Te6edf3kTb4b4b4]Tb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4: Te6edf3pTb4b4b4[Te6edf3kTb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3pTb4b4b4[Te6edf3kTb4b4b4]Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)
Tffa657printTb4b4b4(Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3tableTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72for Te6edf3path Tff7b72in Te6edf3tableTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72== Tff7b72None Tff7b72or Te6edf3destination_hash Tff7b72== Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3displayed Tff7b72+Tff7b72= T79c0ff1
Te6edf3exp_str Tff7b72= Te6edf3RNSTff7b72.Td2a8fftimestamp_strTb4b4b4(Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffexpiresTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1Tb4b4b4: Te6edf3m_str Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff"
Tff7b72elseTb4b4b4: Te6edf3m_str Tff7b72= Ta5d6ff"Ta5d6ffsTa5d6ff"
Tffa657printTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff is Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff hopTa5d6ff"Tff7b72+Te6edf3m_strTff7b72+Ta5d6ff"Ta5d6ff away via Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffviaTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff on Ta5d6ff"Tff7b72+Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffinterfaceTa5d6ff"Tb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff expires Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8fftimestamp_strTb4b4b4(Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffexpiresTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3destination_hash Tff7b72!= Tff7b72None Tff7b72and Te6edf3displayed Tff7b72== T79c0ff0Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffNo path knownTa5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elif Te6edf3ratesTb4b4b4:
Te6edf3destination_hash Tff7b72= Tff7b72None
Tff7b72if Te6edf3destination_hexhash Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3destination_hexhashTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDestination length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3destination_hexhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination entered. Check your input.Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3remote_linkTb4b4b4: Te6edf3table Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffget_rate_tableTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffSending request...Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3receipt Tff7b72= Te6edf3remote_linkTff7b72.Td2a8ffrequestTb4b4b4(Ta5d6ff"Ta5d6ff/pathTa5d6ff"Tb4b4b4, Te6edf3data Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffratesTa5d6ff"Tb4b4b4, Te6edf3destination_hashTb4b4b4]Tb4b4b4)
Tff7b72while Tff7b72not Te6edf3receiptTff7b72.Td2a8ffconcludedTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3receiptTff7b72.Td2a8ffget_responseTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3responseTb4b4b4:
Te6edf3table Tff7b72= Te6edf3response
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe remote request failed. Likely authentication failure.Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff10Tb4b4b4)
Te6edf3table Tff7b72= Tffa657sortedTb4b4b4(Te6edf3tableTb4b4b4, Te6edf3keyTff7b72=Tff7b72lambda Te6edf3eTb4b4b4: Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6fflastTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3jsonTb4b4b4:
Tff7b72import T7ee787json
Tff7b72for Te6edf3p Tff7b72in Te6edf3tableTb4b4b4:
Tff7b72for Te6edf3k Tff7b72in Te6edf3pTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3pTb4b4b4[Te6edf3kTb4b4b4]Tb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4: Te6edf3pTb4b4b4[Te6edf3kTb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3pTb4b4b4[Te6edf3kTb4b4b4]Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)
Tffa657printTb4b4b4(Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3tableTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3tableTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffNo information availableTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3displayed Tff7b72= T79c0ff0
Tff7b72for Te6edf3entry Tff7b72in Te6edf3tableTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72== Tff7b72None Tff7b72or Te6edf3destination_hash Tff7b72== Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3displayed Tff7b72+Tff7b72= T79c0ff1
Tff7b72tryTb4b4b4:
Te6edf3last_str Tff7b72= Te6edf3pretty_dateTb4b4b4(Tffa657intTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6fflastTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3start_ts Tff7b72= Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6fftimestampsTa5d6ff"Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3span Tff7b72= Tffa657maxTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start_tsTb4b4b4, T79c0ff3600.0Tb4b4b4)
Te6edf3span_hours Tff7b72= Te6edf3spanTff7b72/T79c0ff3600.0
Te6edf3span_str Tff7b72= Te6edf3pretty_dateTb4b4b4(Tffa657intTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6fftimestampsTa5d6ff"Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3hour_rate Tff7b72= Tffa657roundTb4b4b4(Tffa657lenTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6fftimestampsTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72/Te6edf3span_hoursTb4b4b4, T79c0ff3Tb4b4b4)
Tff7b72if Te6edf3hour_rateTff7b72-Tffa657intTb4b4b4(Te6edf3hour_rateTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3hour_rate Tff7b72= Tffa657intTb4b4b4(Te6edf3hour_rateTb4b4b4)
Tff7b72if Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffrate_violationsTa5d6ff"Tb4b4b4] Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffrate_violationsTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3s_str Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3s_str Tff7b72= Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3rv_str Tff7b72= Ta5d6ff"Ta5d6ff, Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffrate_violationsTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff active rate violationTa5d6ff"Tff7b72+Te6edf3s_str
Tff7b72elseTb4b4b4:
Te6edf3rv_str Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffblocked_untilTa5d6ff"Tb4b4b4] Tff7b72> Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3bli Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Tb4b4b4(Tffa657intTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffblocked_untilTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72-Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3bl_str Tff7b72= Ta5d6ff"Ta5d6ff, new announces allowed in Ta5d6ff"Tff7b72+Te6edf3pretty_dateTb4b4b4(Tffa657intTb4b4b4(Te6edf3bliTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3bl_str Tff7b72= Ta5d6ff"Ta5d6ff"
Tffa657printTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff last heard Ta5d6ff"Tff7b72+Te6edf3last_strTff7b72+Ta5d6ff"Ta5d6ff ago, Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hour_rateTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff announces/hour in the last Ta5d6ff"Tff7b72+Te6edf3span_strTff7b72+Te6edf3rv_strTff7b72+Te6edf3bl_strTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffError while processing entry for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3destination_hash Tff7b72!= Tff7b72None Tff7b72and Te6edf3displayed Tff7b72== T79c0ff0Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffNo information availableTa5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elif Te6edf3drop_queuesTb4b4b4:
Tff7b72if Te6edf3remote_linkTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffDropping announce queues on remote instances not yet implementedTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff255Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffDropping announce queues on all interfaces...Ta5d6ff"Tb4b4b4)
Te6edf3reticulumTff7b72.Td2a8ffdrop_announce_queuesTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3dropTb4b4b4:
Tff7b72if Te6edf3remote_linkTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffDropping path on remote instances not yet implementedTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff255Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3destination_hexhashTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDestination length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3destination_hexhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination entered. Check your input.Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3reticulumTff7b72.Td2a8ffdrop_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffDropped path to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffUnable to drop path to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. Does it exist?Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elif Te6edf3drop_viaTb4b4b4:
Tff7b72if Te6edf3remote_linkTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffDropping all paths via specific transport instance on remote instances yet not implementedTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff255Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3destination_hexhashTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDestination length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3destination_hexhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination entered. Check your input.Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3reticulumTff7b72.Td2a8ffdrop_all_viaTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffDropped all paths via Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffUnable to drop paths via Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. Does the transport instance exist?Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3remote_linkTb4b4b4:
Tff7b72if Tff7b72not Te6edf3no_outputTb4b4b4:
Tffa657printTb4b4b4(Te6edf3output_rst_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffRequesting paths on remote instances not implementedTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff255Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3destination_hexhashTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDestination length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3destination_hexhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination entered. Check your input.Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPath to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff requested Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= T79c0ff0
Te6edf3syms Tff7b72= Ta5d6ff"Ta5d6ff⢄⢂⢁⡁⡈⡐⡠Ta5d6ff"
Te6edf3limit Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3timeout
Tff7b72while Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4) Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72<Te6edf3limitTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4(Ta5d6ff"Tffea00\bTffea00\bTa5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72%Tffa657lenTb4b4b4(Te6edf3symsTb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3hops Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhops_toTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3next_hop_bytes Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffget_next_hopTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3next_hop_bytes Tff7b72== Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffError: Invalid path data returnedTa5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3next_hop Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3next_hop_bytesTb4b4b4)
Te6edf3next_hop_interface Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffget_next_hop_if_nameTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3hops Tff7b72!= T79c0ff1Tb4b4b4: Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ffsTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ff"
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ffPath found, destination Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff is Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hopsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff hopTa5d6ff"Tff7b72+Te6edf3msTff7b72+Ta5d6ff"Ta5d6ff away via Ta5d6ff"Tff7b72+Te6edf3next_hopTff7b72+Ta5d6ff"Ta5d6ff on Ta5d6ff"Tff7b72+Te6edf3next_hop_interfaceTb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffPath not foundTa5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(Te6edf3descriptionTff7b72=Ta5d6ff"Ta5d6ffReticulum Path Management UtilityTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--configTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to alternative Reticulum config directoryTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--versionTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4, Te6edf3versionTff7b72=Ta5d6ff"Ta5d6ffrnpath Tffd700{version}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3versionTff7b72=Te6edf3__version__Tb4b4b4)Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-tTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--tableTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffshow all known pathsTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-mTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--maxTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657intTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffmaximum hops to filter path table byTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--ratesTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffshow announce rate infoTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-dTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--dropTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffremove the path to a destinationTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-DTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--drop-announcesTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffdrop all queued announcesTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-xTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--drop-viaTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffdrop all paths via specified transport instanceTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-wTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffsecondsTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657floatTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fftimeout before giving upTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUTTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-RTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fftransport identity hash of remote instance to manageTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-iTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to identity used for remote managementTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-WTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffsecondsTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657floatTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fftimeout before giving up on remote queriesTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUTTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-bTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--blackholedTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fflist blackholed identitiesTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-BTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--blackholeTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffblackhole identityTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-UTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--unblackholeTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffunblackhole identityTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4( Ta5d6ff"Ta5d6ff--durationTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657floatTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffduration of blackhole enforcement in hoursTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4( Ta5d6ff"Ta5d6ff--reasonTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffreason for blackholing identityTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-pTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--blackholed-listTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffview published blackhole list for remote transport instanceTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-jTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--jsonTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffoutput in JSON formatTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ffdestinationTa5d6ff"Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffhexadecimal hash of the destinationTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6fflist_filterTa5d6ff"Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fffilter for remote blackhole list viewTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff-vTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff--verboseTa5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffcountTa5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4: Te6edf3configarg Tff7b72= Te6edf3argsTff7b72.Td2a8ffconfig
Tff7b72elseTb4b4b4: Te6edf3configarg Tff7b72= Tff7b72None
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffdrop_announces Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8fftable Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffrates Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffdestination Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffdrop_via Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffblackholedTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffprint_helpTb4b4b4(Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3program_setupTb4b4b4(Te6edf3configdir Tff7b72= Te6edf3configargTb4b4b4, Te6edf3table Tff7b72= Te6edf3argsTff7b72.Td2a8fftableTb4b4b4, Te6edf3rates Tff7b72= Te6edf3argsTff7b72.Td2a8ffratesTb4b4b4, Te6edf3drop Tff7b72= Te6edf3argsTff7b72.Td2a8ffdropTb4b4b4, Te6edf3destination_hexhash Tff7b72= Te6edf3argsTff7b72.Td2a8ffdestinationTb4b4b4,
Te6edf3verbosity Tff7b72= Te6edf3argsTff7b72.Td2a8ffverboseTb4b4b4, Te6edf3timeout Tff7b72= Te6edf3argsTff7b72.Td2a8ffwTb4b4b4, Te6edf3drop_queues Tff7b72= Te6edf3argsTff7b72.Td2a8ffdrop_announcesTb4b4b4, Te6edf3drop_via Tff7b72= Te6edf3argsTff7b72.Td2a8ffdrop_viaTb4b4b4, Te6edf3max_hops Tff7b72= Te6edf3argsTff7b72.Td2a8ffmaxTb4b4b4,
Te6edf3remoteTff7b72=Te6edf3argsTff7b72.Td2a8ffRTb4b4b4, Te6edf3management_identityTff7b72=Te6edf3argsTff7b72.Td2a8ffiTb4b4b4, Te6edf3remote_timeoutTff7b72=Te6edf3argsTff7b72.Td2a8ffWTb4b4b4, Te6edf3blackholedTff7b72=Te6edf3argsTff7b72.Td2a8ffblackholedTb4b4b4, Te6edf3blackholeTff7b72=Te6edf3argsTff7b72.Td2a8ffblackholeTb4b4b4,
Te6edf3unblackholeTff7b72=Te6edf3argsTff7b72.Td2a8ffunblackholeTb4b4b4, Te6edf3blackhole_durationTff7b72=Te6edf3argsTff7b72.Td2a8ffdurationTb4b4b4, Te6edf3blackhole_reasonTff7b72=Te6edf3argsTff7b72.Td2a8ffreasonTb4b4b4, Te6edf3remote_blackhole_listTff7b72=Te6edf3argsTff7b72.Td2a8ffblackholed_listTb4b4b4,
Te6edf3remote_blackhole_list_filterTff7b72=Te6edf3argsTff7b72.Td2a8fflist_filterTb4b4b4, Te6edf3jsonTff7b72=Te6edf3argsTff7b72.Td2a8ffjsonTb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72except Tf85149KeyboardInterruptTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffpretty_dateTb4b4b4(Te6edf3timeTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787datetime Tff7b72import Te6edf3datetime
Te6edf3now Tff7b72= Te6edf3datetimeTff7b72.Td2a8ffnowTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3timeTb4b4b4) Tff7b72is Tffa657intTb4b4b4: Te6edf3diff Tff7b72= Te6edf3now Tff7b72- Te6edf3datetimeTff7b72.Td2a8fffromtimestampTb4b4b4(Te6edf3timeTb4b4b4)
Tff7b72elif Tffa657isinstanceTb4b4b4(Te6edf3timeTb4b4b4,Te6edf3datetimeTb4b4b4)Tb4b4b4: Te6edf3diff Tff7b72= Te6edf3now Tff7b72- Te6edf3time
Tff7b72elif Tff7b72not Te6edf3timeTb4b4b4: Te6edf3diff Tff7b72= Te6edf3now Tff7b72- Te6edf3now
Te6edf3second_diff Tff7b72= Te6edf3diffTff7b72.Td2a8ffseconds
Te6edf3day_diff Tff7b72= Te6edf3diffTff7b72.Td2a8ffdays
Tff7b72if Te6edf3day_diff Tff7b72< T79c0ff0Tb4b4b4: Tff7b72return Ta5d6ff'Ta5d6ff'
Tff7b72if Te6edf3day_diff Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3second_diff Tff7b72< T79c0ff10Tb4b4b4: Tff7b72return Tffa657strTb4b4b4(Te6edf3second_diffTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff secondsTa5d6ff"
Tff7b72if Te6edf3second_diff Tff7b72< T79c0ff60Tb4b4b4: Tff7b72return Tffa657strTb4b4b4(Te6edf3second_diffTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff secondsTa5d6ff"
Tff7b72if Te6edf3second_diff Tff7b72< T79c0ff120Tb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ff1 minuteTa5d6ff"
Tff7b72if Te6edf3second_diff Tff7b72< T79c0ff3600Tb4b4b4: Tff7b72return Tffa657strTb4b4b4(Tffa657intTb4b4b4(Te6edf3second_diff Tff7b72/ T79c0ff60Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff minutesTa5d6ff"
Tff7b72if Te6edf3second_diff Tff7b72< T79c0ff7200Tb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ffan hourTa5d6ff"
Tff7b72if Te6edf3second_diff Tff7b72< T79c0ff86400Tb4b4b4: Tff7b72return Tffa657strTb4b4b4(Tffa657intTb4b4b4(Te6edf3second_diff Tff7b72/ T79c0ff3600Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff hoursTa5d6ff"
Tff7b72if Te6edf3day_diff Tff7b72== T79c0ff1Tb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ff1 dayTa5d6ff"
Tff7b72if Te6edf3day_diff Tff7b72< T79c0ff7Tb4b4b4: Tff7b72return Tffa657strTb4b4b4(Te6edf3day_diffTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff daysTa5d6ff"
Tff7b72if Te6edf3day_diff Tff7b72< T79c0ff31Tb4b4b4: Tff7b72return Tffa657strTb4b4b4(Tffa657intTb4b4b4(Te6edf3day_diff Tff7b72/ T79c0ff7Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff weeksTa5d6ff"
Tff7b72if Te6edf3day_diff Tff7b72< T79c0ff365Tb4b4b4: Tff7b72return Tffa657strTb4b4b4(Tffa657intTb4b4b4(Te6edf3day_diff Tff7b72/ T79c0ff30Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff monthsTa5d6ff"
Tff7b72return Tffa657strTb4b4b4(Tffa657intTb4b4b4(Te6edf3day_diff Tff7b72/ T79c0ff365Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff yearsTa5d6ff"
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4: Te6edf3mainTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────